#include <iostream>
#include <unistd.h>
#include <pthread.h>
using namespace std;
#include <string>
#include "Thread.hpp"

struct ThreadData
{
    int _a;
    int _b;
    int _c;
    ThreadData()
        :_a(0),_b(0),_c(0)
    {

    }
    void Init(int a,int b){
        _a = a;
        _b = b;
    }
    void Execute(){
        _c = _a + _b;
        cout << _c << endl;
    }
    int Reseult(){
        return _c;
    }
};

int main(){
    ThreadData data;
    data.Init(1,2);
    Thread<ThreadData> t([&](ThreadData& data){
        cout << data._a << endl;
        cout << "函数内地址："<< &data << endl;
        data.Execute();
    },data);

    t.Start();

    sleep(3);
    t.Stop();

    sleep(2);
    t.Join();
    
    cout << "地址："<< &data << endl;
    cout << "result: " << data.Reseult() << endl;
    return 0;
}

// int main(){
//     Thread t([](){
//         while(1){
//             cout << "我是新线程,: " << pthread_self() << endl;
//             sleep(1);
//         }
//     });

//     t.Start();

//     sleep(3);
//     t.Stop();

//     sleep(2);
//     t.Join();

//     while(1);
//     return 0;
// }



// __thread int gval = 100;
    
// std::string toHex(pthread_t pid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%lx", pid);
//     return buffer;
// }

// void* run(void* args){

//     std::string name = static_cast<const char*>(args);
//     while(true){
//         std::cout << "I am " << name << ", thread , gval: " << gval<<" , &gval: " << &gval  << std::endl;
//         gval++;
//         sleep(1);
//     }
// }
// int main(){
//     pthread_t pid;
//     pthread_create(&pid,nullptr,run,(void*)"thread-1");

//     while(true){
//         std::cout << "I am main thread gval : " << gval << " &gval: " << &gval << std::endl;
//         sleep(1);
//     }  
//     pthread_join(pid,nullptr);

//     return 0;
// }

// std::string toHex(pthread_t pid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%lx", pid);
//     return buffer;
// }

// void* run(void* args){
//     sleep(1);
//     pthread_detach(pthread_self());
//     std::string name = static_cast<const char*>(args);
//     while(true){
//         std::cout << "I am " << name << ", thread id is : " << toHex(pthread_self())  << std::endl;
//         sleep(1);
//         pthread_exit((void*)10);
//     }
// }
// int main(){
//     pthread_t pid;
//     pthread_create(&pid,nullptr,run,(void*)"thread-1");
//     std::cout << "I am main thread, id is : " << toHex(pthread_self())  << std::endl;
//     sleep(2);
//     // void* ret = nullptr;
//     // int n = pthread_join(pid,&ret);
//     // if (n != 0){
//     //     std::cout << "等待失败" << " n: "  << n << std::endl;
//     //     return 1;
//     // }
//     // else {
//     //     std::cout << "等待成功, ret: " << (long long)(ret) << std::endl;
//     // }
//     while(true){
//         std::cout << "I am main thread id is : " << toHex(pthread_self())  << std::endl;
//         sleep(1);
//     }    
//     return 0;
// }